﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using DataAccess;

namespace BusinessLogic
{
    public class Usuario : Persona
    {
         #region CONSTRUCTORES
        public Usuario() { }
        public Usuario(long pNro, string pMail, string pNom, string pAp, string pTel, string pInt, string pSec, string pPass) 
            : base( pNro,  pMail,  pNom,  pAp,  pTel,  pInt,  pSec,  pPass)
        {}

        #endregion

        #region METODOS
        
        //Agregar nuevo Usuario.
        public void addUsuario()
        {
            ControllerUsuario.getInstancia().insertUsuario((Int32)this.NroFuncionario, this.Nombre, this.Apellido, this.Telefono, this.Interno, this.Mail, this.Seccion);

        }

        //Dar Usuario por numero de funcionario.
        public static Usuario getUsuarioByNro(long pNro)
        {
            DataTable dt = ControllerUsuario.getInstancia().getUsuarioByNro((Int32)pNro);
            //Se verifica si la tabla devuelta contiene algun registro. Si es asi,
            //se parsea y devuelve al tipo Usuario solo el primer item de la lista porque 
            //solo puede haber uno, ya que la consulta utilizada es por numnero de funcionario.
            return ((Persona.parseRegToPersona(dt)).Count() != 0) ? Usuario.Parse((Persona.parseRegToPersona(dt))[0]) : null;

        }

        ////Dar Usuario por nombre.
        //public static List<Usuario> getUsuariosByName(string pNom, string pAp)
        //{
        //    DataTable dt = ControllerUsuario.getInstancia().getUsuarioByName(pNom, pAp);
        //    List<Persona> lstP = Persona.parseRegToPersona(dt);
        //    //Se castea la lista de "personas" a una de "usuarios"
        //    List<Usuario> lstU = lstP.Cast<Usuario>().ToList();
        //    //Se retorna la lista de usuarios con el nombre y apellido requeridos.
        //    return lstU;
        //}

        //Dar usuarios por estado.
        public static List<Usuario> getUsuariosByEstado(bool pEstado)
        {
            DataTable dt = ControllerUsuario.getInstancia().getUsuariosByEstado(pEstado);
            List<Persona> lstP = Persona.parseRegToPersona(dt);
            //Se castea la lista de "personas" a una de "usuarios"
            List<Usuario> lstU = lstP.Cast<Usuario>().ToList();
            //Se retorna la lista de usuarios con el estado requerido.
            return lstU;
        }

        //Parsear del Tipo Persona a Usuario.
        public static Usuario Parse(Persona p)
        {
            Usuario unU = new Usuario();
            unU.NroFuncionario = p.NroFuncionario;
            unU.Nombre = p.Nombre;
            unU.Apellido = p.Apellido;
            unU.Telefono = p.Telefono;
            unU.Interno = p.Interno;
            unU.Mail = p.Mail;
            unU.Seccion = p.Seccion;
            unU.Contrasenia = p.Contrasenia;
            unU.Activo = p.Activo;

            return unU;
        }
        #endregion
    }
}
